/*
-----------------------------------------------------------------------------
This source file is part of the OGRE Reference Application, a layer built
on top of OGRE(Object-oriented Graphics Rendering Engine)
For the latest info, see http://www.ogre3d.org/

Copyright (c) 2000-2006 Torus Knot Software Ltd
Also see acknowledgements in Readme.html

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA, or go to
http://www.gnu.org/copyleft/lesser.txt.

You may alternatively use this source under the terms of a specific version of
the OGRE Unrestricted License provided you have obtained such a license from
Torus Knot Software Ltd.
-----------------------------------------------------------------------------
*/
#ifndef __REFAPP_BALL_H__
#define __REFAPP_BALL_H__

#include "OgreRefAppPrerequisites.h"
#include "OgreRefAppApplicationObject.h"
#include "OgreRefAppStateMachine.h"

namespace OgreRefApp
{

    class _OgreRefAppExport Ball : public ApplicationObject
    {
    protected:
        Real mRadius;
        ApplicationObject* m_pOwner;
        void setUp(const String& name);
    private:


    public:
        Ball(const String& name, Real radius);
        ~Ball();

        Real getRadius(void);

        bool handleMessage(const ApplicationObject::CollisionInfo& msg);

        void _notifyCollided(ApplicationObject* otherObj, const ApplicationObject::CollisionInfo& info);

        void setOwner( ApplicationObject* owner )
        {
            m_pOwner = owner;
        }

        ApplicationObject* getOwner( )
        {
            return m_pOwner;
        }

        //this method applies a directional force to the ball (kicks it!)
        void      Kick(Ogre::Vector3 direction, Real force);

        void update(void);

        void      Trap()
        {
            setLinearVelocity(0,0,0);
        }

        //given a kicking force and a distance to traverse defined by start
        //and finish points, this method calculates how long it will take the
        //ball to cover the distance.
        Real    TimeToCoverDistance(Ogre::Vector3 from,
                                      Ogre::Vector3 to,
                                      Real     force);

        //this places the ball at the desired location and sets its velocity to zero
        void      PlaceAtPosition(Ogre::Vector3 NewPos);

        //this can be used to vary the accuracy of a player's kick.
        Ogre::Vector3 AddNoiseToKick(Ogre::Vector3 BallPos, Ogre::Vector3* BallTarget);
    };


}

#endif


